package com.vic.sb12.service.d_threadpool;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;

import java.util.concurrent.Future;

/**
 * 如果不自定义异步方法的线程池则默认使用SimpleAsyncTaskExecutor线程池。
 *      SimpleAsyncTaskExecutor：不是真的线程池，这个类不重用线程，每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题。
 * Spring也更加推荐我们开发者使用ThreadPoolTaskExecutor类来创建线程池。
 * @author victor
 */
@Component
@Slf4j
public class FutureExecutorTask {

    @Async("myAsyncExecutor")
    public Future<String> taskOne() throws Exception {
        log.info("任务1线程名称 = {}", Thread.currentThread().getName());
        return new AsyncResult<>("1完成");
    }
    @Async("myAsyncExecutor")
    public Future<String> taskTwo() throws Exception {
        log.info("任务2线程名称 = {}", Thread.currentThread().getName());
        return new AsyncResult<>("2完成");
    }

    @Async
    public Future<String> taskThree() throws Exception {
        log.info("任务3线程名称 = {}", Thread.currentThread().getName());
        return new AsyncResult<>("执行任务3完成");
    }
}